<html lang="zh-CN"><head><meta charset="UTF-8"><style>.nodata  main {width:1000px;margin: auto;}</style></head><body class="nodata " style=""><div class="main_father clearfix d-flex justify-content-center " style="height:100%;"> <div class="container clearfix " id="mainBox"><main><div class="blog-content-box">
<div class="article-header-box">
<div class="article-header">
<div class="article-title-box">
<h1 class="title-article" id="articleContentId">(C卷,100分)- 求最多可以派出多少支团队（Java & JS & Python & C）</h1>
</div>
</div>
</div>
<div id="blogHuaweiyunAdvert"></div>

        <div id="article_content" class="article_content clearfix">
        <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/kdoc_html_views-1a98987dfd.css">
        <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/ck_htmledit_views-044f2cf1dc.css">
                <div id="content_views" class="htmledit_views">
                    <h4 id="main-toc">题目描述</h4> 
<p>用数组代表每个人的能力&#xff0c;一个比赛活动要求参赛团队的最低能力值为N&#xff0c;每个团队可以由1人或者2人组成&#xff0c;且1个人只能参加1个团队&#xff0c;计算出最多可以派出多少只符合要求的团队。</p> 
<p></p> 
<h4 id="%E8%BE%93%E5%85%A5%E6%8F%8F%E8%BF%B0">输入描述</h4> 
<ul><li>第一行代表总人数&#xff0c;范围1-500000</li><li>第二行数组代表每个人的能力 
  <ul><li>数组大小&#xff0c;范围1-500000</li><li>元素取值&#xff0c;范围1-500000</li></ul></li><li>第三行数值为团队要求的最低能力值&#xff0c;范围1-500000</li></ul> 
<p></p> 
<h4 id="%E8%BE%93%E5%87%BA%E6%8F%8F%E8%BF%B0">输出描述</h4> 
<p>最多可以派出的团队数量</p> 
<p></p> 
<h4 id="%E7%94%A8%E4%BE%8B">用例</h4> 
<table border="1" cellpadding="1" cellspacing="1" style="width:500px;"><tbody><tr><td style="width:86px;">输入</td><td style="width:412px;">5<br /> 3 1 5 7 9<br /> 8</td></tr><tr><td style="width:86px;">输出</td><td style="width:412px;">3</td></tr><tr><td style="width:86px;">说明</td><td style="width:412px;">说明 3、5组成一队   1、7一队  9自己一队  输出3</td></tr></tbody></table> 
<table border="1" cellpadding="1" cellspacing="1" style="width:500px;"><tbody><tr><td style="width:86px;">输入</td><td style="width:412px;">7<br /> 3 1 5 7 9 2 6<br /> 8</td></tr><tr><td style="width:86px;">输出</td><td style="width:412px;">4</td></tr><tr><td style="width:86px;">说明</td><td style="width:412px;">3、5组成一队&#xff0c;1、7一队&#xff0c;9自己一队&#xff0c;2、6一队&#xff0c;输出4</td></tr></tbody></table> 
<table border="1" cellpadding="1" cellspacing="1" style="width:500px;"><tbody><tr><td style="width:86px;">输入</td><td style="width:412px;">3<br /> 1 1 9<br /> 8</td></tr><tr><td style="width:86px;">输出</td><td style="width:412px;">1</td></tr><tr><td style="width:86px;">说明</td><td style="width:412px;">9自己一队&#xff0c;输出1</td></tr></tbody></table> 
<p></p> 
<h4 id="%E9%A2%98%E7%9B%AE%E8%A7%A3%E6%9E%90">题目解析</h4> 
<p>本题要求最多的组队&#xff0c;而组队要求是&#xff1a;</p> 
<ul><li>可以1人组队&#xff0c;也可以2人组队</li><li>团队的能力值之和需要大于等于最低能力minCap要求</li></ul> 
<p>因此&#xff0c;为了组更多队伍&#xff0c;我们应该尽量让单人组队&#xff0c;即&#xff1a;</p> 
<ul><li>需要将能力值大于等于minCap的筛选出来&#xff0c;单人组队</li></ul> 
<p>然后剩余的人&#xff0c;按照能力值升序排序&#xff0c;定义L,R指针&#xff0c;初始时L&#61;0&#xff0c;R&#61;k-1&#xff0c;k是剩余人总数</p> 
<p>接着尝试L&#xff0c;R进行组队&#xff1a;</p> 
<ul><li>如果L&#xff0c;R两人的能力之和大于等于minCap&#xff0c;则组队成功&#xff0c;L&#43;&#43;&#xff0c;R--</li><li>否则&#xff0c;说明L无法和任何人组队&#xff0c;因为R已经是当前最高能力的人&#xff0c;L无法和R组队&#xff0c;则也意味着无法和能力值比R低的人组队&#xff0c;因此L&#43;&#43;</li></ul> 
<p>在上面过程中&#xff0c;计算出组队个数作为题解。</p> 
<p></p> 
<h4>Java算法源码</h4> 
<pre><code class="language-java">import java.util.Arrays;
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc &#61; new Scanner(System.in);

    int n &#61; Integer.parseInt(sc.nextLine());

    int[] capacities &#61;
        Arrays.stream(sc.nextLine().split(&#34; &#34;)).mapToInt(Integer::parseInt).toArray();

    int minCap &#61; Integer.parseInt(sc.nextLine());

    System.out.println(getResult(n, capacities, minCap));
  }

  public static int getResult(int n, int[] capacities, int minCap) {
    // 升序
    Arrays.sort(capacities);

    int l &#61; 0;
    int r &#61; n - 1;

    // 记录题解
    int ans &#61; 0;

    // 单人组队
    while (r &gt;&#61; l &amp;&amp; capacities[r] &gt;&#61; minCap) {
      r--;
      ans&#43;&#43;;
    }

    // 双人组队
    while (l &lt; r) {
      int sum &#61; capacities[l] &#43; capacities[r];

      // 如果两个人的能力值之和&gt;&#61;minCap&#xff0c;则组队
      if (sum &gt;&#61; minCap) {
        ans&#43;&#43;;
        l&#43;&#43;;
        r--;
      } else {
        // 否则将能力低的人剔除&#xff0c;换下一个能力更高的人
        l&#43;&#43;;
      }
    }

    return ans;
  }
}
</code></pre> 
<p></p> 
<h4 id="%E7%AE%97%E6%B3%95%E6%BA%90%E7%A0%81">JS算法源码</h4> 
<pre><code class="language-javascript">/* JavaScript Node ACM模式 控制台输入获取 */
const readline &#61; require(&#34;readline&#34;);

const rl &#61; readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const lines &#61; [];
rl.on(&#34;line&#34;, (line) &#61;&gt; {
  lines.push(line);

  if (lines.length &#61;&#61;&#61; 3) {
    let n &#61; parseInt(lines[0]);
    let capacities &#61; lines[1].split(&#34; &#34;).slice(0, n).map(Number);
    let minCap &#61; parseInt(lines[2]);

    console.log(getResult(n, capacities, minCap));

    lines.length &#61; 0;
  }
});

function getResult(n, capacities, minCap) {
  // 升序
  capacities.sort((a, b) &#61;&gt; a - b);

  let l &#61; 0;
  let r &#61; n - 1;

  // 记录题解
  let ans &#61; 0;

  // 单人组队
  while (r &gt;&#61; l &amp;&amp; capacities[r] &gt;&#61; minCap) {
    r--;
    ans&#43;&#43;;
  }

  // 双人组队
  while (l &lt; r) {
    const sum &#61; capacities[l] &#43; capacities[r];

    // 如果两个人的能力值之和&gt;&#61;minCap&#xff0c;则组队
    if (sum &gt;&#61; minCap) {
      ans&#43;&#43;;
      l&#43;&#43;;
      r--;
    } else {
      // 否则将能力低的人剔除&#xff0c;换下一个能力更高的人
      l&#43;&#43;;
    }
  }

  return ans;
}
</code></pre> 
<p></p> 
<h4>Python算法源码</h4> 
<pre><code class="language-python"># 输入获取
n &#61; int(input())
capacities &#61; list(map(int, input().split()))
minCap &#61; int(input())


# 算法入口
def getResult():
    # 升序
    capacities.sort()

    l &#61; 0
    r &#61; n - 1

    # 记录题解
    ans &#61; 0

    # 单人组队
    while r &gt;&#61; l and capacities[r] &gt;&#61; minCap:
        ans &#43;&#61; 1
        r -&#61; 1

    # 双人组队
    while l &lt; r:
        total &#61; capacities[l] &#43; capacities[r]

        # 如果两个人的能力值之和&gt;&#61;minCap&#xff0c;则组队
        if total &gt;&#61; minCap:
            ans &#43;&#61; 1
            l &#43;&#61; 1
            r -&#61; 1
        else:
            # 否则将能力低的人剔除&#xff0c;换下一个能力更高的人
            l &#43;&#61; 1

    return ans


# 调用算法
print(getResult())
</code></pre> 
<p> </p> 
<h4>C算法源码</h4> 
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

#define MAX(a,b) ((a) &gt; (b) ? (a) : (b))

int cmp(const void* a, const void* b) {
    return (*(int*) a) - (*(int*) b);
}

int main() {
    int n;
    scanf(&#34;%d&#34;, &amp;n);

    int capacities[n];
    for(int i&#61;0; i&lt;n; i&#43;&#43;) {
        scanf(&#34;%d&#34;, &amp;capacities[i]);
    }

    int minCap;
    scanf(&#34;%d&#34;, &amp;minCap);

    // 升序
    qsort(capacities, n, sizeof(int), cmp);

    int l &#61; 0;
    int r &#61; n - 1;

    // 记录题解
    int ans &#61; 0;

    // 单人组队
    while(r &gt;&#61; l &amp;&amp; capacities[r] &gt;&#61; minCap) {
        r--;
        ans&#43;&#43;;
    }

    // 双人组队
    while(l &lt; r) {
        int sum &#61; capacities[l] &#43; capacities[r];

        if(sum &gt;&#61; minCap) {
            // 如果两个人的能力值之和&gt;&#61;minCap&#xff0c;则组队
            ans&#43;&#43;;
            l&#43;&#43;;
            r--;
        } else {
            // 否则将能力低的人剔除&#xff0c;换下一个能力更高的人
            l&#43;&#43;;
        }
    }

    printf(&#34;%d\n&#34;, ans);

    return 0;
}</code></pre> 
<p> </p>
                </div>
        </div>
        <div id="treeSkill"></div>
        <div id="blogExtensionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box"></div>
    <script>
  $(function() {
    setTimeout(function () {
      var mathcodeList = document.querySelectorAll('.htmledit_views img.mathcode');
      if (mathcodeList.length > 0) {
        for (let i = 0; i < mathcodeList.length; i++) {
          if (mathcodeList[i].naturalWidth === 0 || mathcodeList[i].naturalHeight === 0) {
            var alt = mathcodeList[i].alt;
            alt = '\\(' + alt + '\\)';
            var curSpan = $('<span class="img-codecogs"></span>');
            curSpan.text(alt);
            $(mathcodeList[i]).before(curSpan);
            $(mathcodeList[i]).remove();
          }
        }
        MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
      }
    }, 1000)
  });
</script>
</div></html>